#include<bits/stdc++.h> 
using namespace std;
//	回文数指的是从前往后和从后往前写都是一样的数字，单个数码的数字也是。虽然回文数常常指
//	的是十进制的，但是这个概念可以扩充到其他进制。假设一个b进制的N>0，b≥2，由k+1个数码组
//	成，0≤a_i<b，并且a_k不是0。当且仅当a_i=a_(k-i)对于任意i都成立，该N为回文数。现在给定
//	一个十进制正整数N和一个进制b，需要判断在b进制下该数字是否为回文数。
//1.每一个输入都包含一个测试用例，每个用例都由两个正整数N与b组成，0<N≤10^9，2≤b≤10^9
//2.对于每个测试用例，如果N是回文数，则输出一个Yes，不是就输出No。然后输出b进制下的N
//3.数组遍历，进制转换
int a[100];	//平时是用字符串来做回文数，但是这里因为进制很大，所以不能用字符串表示，所以用数字数组，把求余的结果存到数组里了 
int len = 0;	//数组长度 
void change(long N, long b){	//把该进制的内容存进来 
	while(N!=0){
		int t = N % b;
		a[len] = t;
		len++;
		N /= b;
	}
}
bool pali(){	//判断两边对应位置的数字是否一致 
	for(int i = 0; i<len/2;i++){
		if(a[i]!=a[len-i-1]) return false;
	}
	return true;
}
int main()
{
	long N, b;
	cin>>N>>b;
	if(N==0){
		cout<<"Yes"<<endl<<"0"<<endl;
	}
	else{
		change(N, b);
		if(pali()) cout<<"Yes"<<endl;
		else cout<<"No"<<endl;
		for(int i =len-1;i>=0;i--){
			cout<<a[i];
			if(i!=0) cout<<" ";
			else cout<<endl;
		}
	}
	return 0;
 } 

